import { AjaxResultTypeEnum } from '@/enums/ajaxResultTypeEnum';
import { FilterOperateEnum } from '@/enums/filterOperateEnum';
import { RequestEnum } from '@/enums/httpEnum';
import { ListSortDirectionEnum } from '@/enums/listSortDirectionEnum';

/** 错误消息提示模式 */
export type ErrorMessageMode = 'message' | 'modal' | 'none' | undefined;
export type SuccessMessageMode = ErrorMessageMode;

/** 请求参数 */
export interface RequestOptions {
  /** 提供者，可用于辨识服务提供对象。 */
  provider?: string;
  /** 将请求参数拼接到url（Splicing request parameters to url） */
  joinParamsToUrl?: boolean;
  /** 格式化请求参数时间（Format request parameter time） */
  formatDate?: boolean;
  /** 是否处理请求结果（Whether to process the request result） */
  isTransformResponse?: boolean;
  /** 是否返回原生响应头 比如：需要获取响应头时使用该属性
   * （Whether to return native response headers For example: use this attribute when you need to get the response headers）
   */
  isReturnNativeResponse?: boolean;
  /** 接口地址，如果保留为空，则使用默认的apiUrl（Interface address, use the default apiUrl if you leave it blank） */
  apiUrl?: string;
  /** 是否加入url（Whether to join url） */
  joinPrefix?: boolean;
  /** 请求拼接路径 */
  urlPrefix?: string;
  /** 错误消息提示类型（Error message prompt type） */
  errorMessageMode?: ErrorMessageMode;
  /** 成功消息提示类型（Success message prompt type） */
  successMessageMode?: SuccessMessageMode;
  /** 是否添加时间戳（Whether to add a timestamp） */
  joinTime?: boolean;
  /** 忽略取消标记（Ignore CancelToken） */
  ignoreCancelToken?: boolean;
  /** 是否在头中发送令牌（Whether to send token in header） */
  withToken?: boolean;
  /** 请求重试机制 */
  retryRequest?: RetryRequest;
  /** 启用401拦截：当返回401时，将尝试刷新token后再进行请求，如果依然返回401，将执行登出等逻辑。 */
  icUnauthorized?: boolean;
}

/** 请求重试机制 */
export interface RetryRequest {
  /** 开启重试机制 */
  isOpenRetry: boolean;
  /** 重试方法 */
  methods?: (RequestEnum | string)[];
  /** 重试次数 */
  count?: number;
  /** 等待时间（毫秒） */
  waitTime?: number;
}

/** 多部分/表单数据：上载文件（multipart/form-data: upload file） */
export interface UploadFileParams {
  /** 其他参数（Other parameters） */
  data?: Recordable;
  /** 文件参数接口字段名称（File parameter interface field name） */
  name?: string;
  /** 文件（file name） */
  file: Blob | File;
  /** 文件名（file name） */
  filename?: string;
  [key: string]: any;
}

/**  请求结果 */
export interface AjaxResult<T = any> {
  /**  结果类型 */
  Type: AjaxResultTypeEnum | number;
  /**  消息内容 */
  Content: string;
  /**  返回数据 */
  Data: T;

  /**  是否成功 */
  Succeeded: boolean;
  /**  是否失败 */
  Failed: boolean;
}

/** 查询条件 */
export class FilterRule {
  [key: string]: any;
  /** 属性名 */
  Field?: string;
  /** 是否将属性名称驼峰(lowerCase)写法转换为帕斯卡(UpperCase)写法 */
  IsLowerCaseToUpperCase?: boolean;

  /** 非外键关联查询的实体类型 */
  JoinEntityType?: string;

  /** 非外键关联查询的过滤字段名 */
  JoinFilterField?: string;
  /** 非外键关联查询的选择字段名 */
  JoinSelectField?: string;
  /** 对比操作 */
  Operate?: FilterOperateEnum;

  /** 属性值 */
  Value: any;

  /**
   * 实例化一个条件信息
   * @param field 字段名
   * @param value 属性值
   * @param operate 对比操作
   */
  constructor(field: string | undefined, value: any, operate: FilterOperateEnum | undefined = undefined) {
    this.Field = field;
    this.Value = value;
    this.Operate = operate;
  }
}
/**  查询条件组 */
export class FilterGroup {
  /** 条件组集合 */
  Groups: FilterGroup[] = [];
  /**  Level */
  Level = 1;
  /** 条件间操作 */
  Operate: FilterOperateEnum = FilterOperateEnum.And;
  /** 条件集合 */
  Rules: FilterRule[] = [];

  /** 初始化 */
  static Init(group: FilterGroup) {
    if (!group.Level) {
      group.Level = 1;
    }
    group.Groups.forEach((subGroup) => {
      subGroup.Level = group.Level + 1;
      FilterGroup.Init(subGroup);
    });
  }
}

/**  排序条件 */
export class SortCondition {
  /**  排序方向 */
  ListSortDirection: ListSortDirectionEnum = ListSortDirectionEnum.Ascending;
  /**  排序字段名称 */
  SortField = '';
}

/**  分页条件 */
export class PageCondition {
  /**  页序 */
  PageIndex = 1;
  /**  分页大小 */
  PageSize = 20;
  /**  排序条件集合 */
  SortConditions: SortCondition[] = [];
}

/**  分页请求 */
export class PageRequest {
  /**  查询条件组 */
  FilterGroup: FilterGroup = new FilterGroup();
  /**  分页条件信息 */
  PageCondition: PageCondition = new PageCondition();
}

/**  分页数据 */
export interface PageData<T = any> {
  /**  数据行 */
  Rows: T[];
  /**  总记录数 */
  Total: bigint | string;
}

/** 二维码Dto */
export interface QRCodeDto {
  /** 二维码内容 */
  Content: QRCodeContentDto;

  /** 二维码图片的Base64格式 */
  Image: string;
  /** 是否已扫描 */
  IsScan: boolean;
}
/** 二维码内容Dto */
export interface QRCodeContentDto {
  /** 编号 */
  Id: string;
  /** 类型 */
  Type: string;

  /** 客户端类型 */
  ClientType: number;
  /** 客户端ID */
  ClientId: string;

  /** 附加数据 */
  Data: any;
}
